/* ======================================== INCLUDES ======================================== */
#include "bsp_mic.h"

#include "bsp_leds.h"

/* ======================================== MACROS ========================================== */
extern ADC_HandleTypeDef hadc1;


//#define Light_Max   (20u)
/* ======================================== TYPES =========================================== */
/* ======================================== GLOBAL VARIABLES ================================ */
// 正在闪烁的灯颗数
uint16_t adc_value[1] = 0;

/* ======================================== LOCAL VARIABLES ================================= */
/* ======================================== PROTOTYPES ====================================== */
/* ======================================== INTERNAL IMPLEMENTATION ========================= */
/* ======================================== EXTERNAL IMPLEMENTATION ========================= */

uint8_t Mic_Get_Degree(void)
{// 麦克风等级
    uint16_t average_value = 0;
        
    //printf("adc_value:%d\n", adc_value[0]);
    
    for (int i = 0; i < 5; i++)
    {
        average_value += adc_value[0];
    }
    average_value = average_value / 5;
    
    if (adc_value[0] > 2500)
    {
        return 40;
    }
    else if (adc_value[0] > 2400)
    {
        return 34;
    }
    else if (adc_value[0] > 2170)
    {
        return 20;
    }
    else if (adc_value[0] > 2160)
    {
        return 14;
    }
    else if (adc_value[0] > 2150)
    {
        return 8;
    }
    else if (adc_value[0] > 2145)
    {
        return 5;
    }
    else if (adc_value[0] > 2140)
    {
        return 3;
    }
    else // if (adc_value < 2200)
    {
        return 0;
    }
}

void Mic_Light(void)
{
    static uint8_t current_grade = 0;  // 当前实际显示的灯数（核心变量）
    static uint8_t heightes_grade = 0;
    
    for (int i = 0; i < 5; i++)
      {// 采集多少次,取采集的 等级最大值
          heightes_grade = Mic_Get_Degree(); // 获取当前等级
          
          if (heightes_grade < current_grade)
          {// 当前等级记录最高等级
              heightes_grade = current_grade;
          }
      }
      if (heightes_grade > 0)
      {
          heightes_grade --;
      }
      
      if (heightes_grade > get_current_lighting())
      {
          WS2812_Light_Music_Setcount(heightes_grade);
          heightes_grade = 0;
      }
      // 采集多次，取最大等级作为本周期的等级
      current_grade = 0;
      for (int i = 0; i < 5; i++)
      {
          uint8_t g = Mic_Get_Degree(); // 获取当前等级
          if (g > current_grade) current_grade = g;
      }
      heightes_grade = current_grade;

      // 如果有等级>0，每次循环都调用 Setcount，让 WS2812 内部根据持续调用来渐变色相
      if (heightes_grade > get_current_lighting())
      {
          WS2812_Light_Music_Setcount(heightes_grade);
      }

}

void Mic_Init(void)
{ 
    HAL_ADCEx_Calibration_Start(&hadc1);
    HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_value, 1);
    
    __HAL_DMA_DISABLE_IT(hadc1.DMA_Handle, DMA_IT_HT);
    __HAL_DMA_DISABLE_IT(hadc1.DMA_Handle, DMA_IT_TC);
    
}



